using UnityEngine;
using System.Collections;

public class Button2D 
{
	#region Atributos

    //Som
    private Som2D buttonClick;

	private Texture textura;
    private string buttonString = "";
	private Vector2 pos;

	private bool onClick;
	private GUI.WindowFunction action;
    private GUIStyle gs;
	private int id;

    private int altura;
    private int largura;

    private bool showButtonBackground;

    private bool enabled, enabledAction;

	#endregion 
	
	#region Construtor
	/// <summary>
	/// Construtor simples
	/// </summary>
	public Button2D()
	{
	     //Instanciando novo som
        buttonClick = new Som2D("Sounds/button",GameObject.FindWithTag("MainCamera"));
        gs = new GUIStyle();
        enabledAction = true;
        enabled = true;
	}
	/// <summary>
	/// Construtor, devem ser passados a textura, posição e a ação do botão
	/// </summary>
	public Button2D(Texture texture, Vector2 pos, GUI.WindowFunction function, int id, bool showBackgroundButton = true)
	{
		this.textura = texture;
     	this.pos = pos;
		this.action = function;
		this.id = id;
        this.showButtonBackground = showBackgroundButton;
        this.largura = textura.width;
        this.altura = textura.height;
        gs = new GUIStyle();
        //Instanciando novo som
        buttonClick = new Som2D("Sounds/button",GameObject.FindWithTag("MainCamera"));
        enabledAction = true;
        enabled = true;
    }
    
    /// <summary>
    /// Construtor, devem ser passada a string a ser escrita no botão
    /// </summary>
    public Button2D(string buttonString,int larguraBotao, int alturaBotao, Vector2 pos, GUI.WindowFunction function, int id, bool showBackgroundButton = true)
    {
        this.buttonString = buttonString;
        this.pos = pos;
		this.action = function;
		this.id = id;
        this.showButtonBackground = showBackgroundButton;
        this.largura =larguraBotao;
        this.altura = alturaBotao;
        gs = new GUIStyle();
        //Instancinando novo som
         buttonClick = new Som2D("Sounds/button",GameObject.FindWithTag("MainCamera"));
         enabledAction = true;
         enabled = true;
    }

	#endregion 
    	
	#region Propriedades

    public Texture Textura
    {
        get{return textura;}
        set {textura = value;}
    }
  
	public Vector2 Position
	{
		get{return  pos;}
		set{pos = value;}
	}

	public GUI.WindowFunction Action
	{
		get{return action;}
		set{action = value;}
	}

	public bool OnClick
	{
		get{return onClick;}
		set{onClick = value;}
	}

    public int Altura
    {
        get { return altura; }
        set { altura = value; }
    }

    public int Largura
    {
        get { return largura; }
        set { largura = value; }
    }

    public bool ShowBackgroundButton
    {
        get{return showButtonBackground;}
        set{showButtonBackground = value;}
    }

    public string ButtonText
    {
        get { return buttonString; }
        set { buttonString = value; }
    }

    public Som2D ClickSound
    {
        get { return buttonClick; }
        set { buttonClick = value; }
    }

    public GUIStyle GS
    {
        get { return gs; }
        set { gs = value; }
    }

    public bool Enabled
    {
        get { return enabled; }
        set { enabled = value; }
    }

    public bool EnabledAction
    {
        get { return enabledAction; }
        set { enabledAction = value; }
    }

	#endregion 
	
	#region Draw

	/// <summary>
	/// Desenha o botão e é responsável também pela verificação do clique!
	/// </summary>
	public void Draw(float alfa = 1)
	{
        if (enabled)
        {
            if (showButtonBackground)
            {
                //Desenha os botões com o background do skin
                DesenhaBotoesBackground(alfa);
            }
            else
            {
                //Desenhas os botões sem o background
                DesenhaBotoesSemBackground(alfa);
            }
        }
	}

    /// <summary>
    /// Método que desenha os botões sem o background
    /// </summary>
    private void DesenhaBotoesSemBackground(float alfa)
    {
        GUI.color = new Color(1, 1, 1, alfa);

        //Verifica se foi passada uma textura
        if (textura != null)
        {
            if (GUI.Button(new Rect(pos.x, pos.y, largura, altura), textura, gs))
            {
                onClick = true;
                if (enabledAction)
                {
                    buttonClick.Play();
                    action.Invoke(id);
                }
            }
        }
        else
        {
            //Se nao foi passada nenhuma textura desenha com a string
            if (GUI.Button(new Rect(pos.x, pos.y, largura, altura), buttonString, gs))
            {
                onClick = true;
                if (enabledAction)
                {
                    action.Invoke(id);
                    buttonClick.Play();
                }
            }
        }

        GUI.color = new Color(1, 1, 1, 1);
    }

    /// <summary>
    /// Método que desenha os botões com o background
    /// </summary>
    private void DesenhaBotoesBackground(float alfa)
    {
        GUI.color = new Color(1, 1, 1, alfa);

       //Verifica se foi passada uma textura
        if (textura != null)
        {
            if (GUI.Button(new Rect(pos.x, pos.y, largura, altura), textura))
            {
                onClick = true;
                if (enabledAction)
                { 
                    action.Invoke(id);
                    buttonClick.Play();
                }
            }
        }
        else
        {
            //Se não desenha o botão com a string
            if (GUI.Button(new Rect(pos.x, pos.y, largura, altura), buttonString))
            {
                onClick = true;
                if (enabledAction)
                {
                    action.Invoke(id);
                    buttonClick.Play();
                }
            }
        }

        GUI.color = new Color(1, 1, 1, 1);
    }
	
	#endregion 

}
